package com.jandar.task;

import java.awt.Color;
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import java.util.TimerTask;

import com.jandar.Resources;
import com.jandar.Watcher;
import com.jandar.gui.GUIWatcher;
import com.jandar.logging.Logger;
import com.jandar.logging.LoggerFactory;
import com.jandar.parser.BaseParser;
import com.jandar.parser.IParser;
import com.jandar.util.DBUtils;
import com.jandar.util.DateUtils;
import com.jandar.util.ExceptionUtils;
import com.jandar.util.FileUtils;

/**
 * 默认定时器任务。
 * 
 * @author pqj
 * @version 2009-7-9
 */
public class DefaultTimerTask extends TimerTask implements ILastWork {

	/** 批量导入时间 */
	protected Date batchDate = null;

	/** true: 同一批, false: 不是同一批 */
	protected boolean batchFlag = true;

	/** 日志文件 */
	protected Logger logger = LoggerFactory.getInstance(this.getClass());

	/** 文件操作 */
	protected FileUtils fileOperator = FileUtils.getInstance();

	/** 文件类型列表 */
	protected String[] fileType = Resources.getInstance().getFileType();;

	/** 批量导入结果信息 */
	protected StringBuilder resultBuf = new StringBuilder();

	/** 批量导入次数 */
	protected int batchCount = 0;

	@Override
	public void run() {

		GUIWatcher gui = GUIWatcher.THIS_OBJECT;

		if (gui != null) {
			String stateTextValue = gui.getStateTextValue();
			Color stateTextColor = gui.getStateColor();
			gui.setWatchState("正在扫描文件夹 ...");
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			gui.setStateText(stateTextValue, stateTextColor);
		}

		// 文件夹是否为空
		if (fileOperator.isInfolderEmpty()) {
			batchDate = new Date();
			if (!batchFlag) {
				logger.info("批量导入文件结束时间：" + DateUtils.format(DateUtils.PATTERN_1, batchDate));
				gui.setStatusBarText(resultBuf.toString());
			}
			batchFlag = true;
			return;
		}

		// 匹配文件夹内文件
		File[] files = fileOperator.fetchFiles();
		File curFile = null;
		for (File file : files) {
			if (Watcher.matchFile(file, fileType)) {
				curFile = file;
				break;
			}
		}

		// 找不到匹配文件
		if (curFile == null) {
			batchDate = new Date();
			if (!batchFlag) {
				logger.info("批量导入文件结束时间：" + DateUtils.format(DateUtils.PATTERN_1, batchDate));
				gui.setStatusBarText(resultBuf.toString());
			}
			batchFlag = true;
			return;
		}

		if (batchFlag) {
			++batchCount;
			batchDate = new Date();
			logger.info("批量导入文件批次：" + batchCount);
			logger.info("批量导入文件开始时间：" + DateUtils.format(DateUtils.PATTERN_1, batchDate));
			batchFlag = false;
			resultBuf.delete(0, resultBuf.length());
			resultBuf.append("批次：" + batchCount + "  ");
		}

		logger.info("准备导入文件<" + curFile.getAbsolutePath() + ">");
		resultBuf.append("文件：" + curFile.getName() + ",");
		if (gui != null) {
			gui.setWatchState("导入文件<" + curFile.getName() + "> ...");
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		// 连接数据库
		Connection conn = null;
		try {
			logger.debug("连接数据库<" + Resources.getInstance().getUrl() + ">...");
			conn = DBUtils.getInstance().getConnection();
			conn.setAutoCommit(true);
			logger.debug("数据库连接成功！");
		} catch (SQLException e) {
			logger.debug("数据库连接失败！执行中断。");
			ExceptionUtils.error(e);
			return;
		}

		IParser parser = null;
		// 进行导入操作
		try {
			// 当前文件扩展名
			String curFileType = curFile.getName();
			curFileType = curFileType.substring(curFileType.lastIndexOf('.')).toLowerCase();

			if (BaseParser.XLS_TYPE.equals(curFileType)) {

				logger.info("文件<" + curFile.getName() + ">导入中...");
				parser = BaseParser.getInstance(BaseParser.XLS_TYPE);
				parser.insertOrUpdate(conn, curFile);
			} else if (BaseParser.TXT_TYPE.equals(curFileType)) {

				logger.info("文件<" + curFile.getName() + ">导入中...");
				parser = BaseParser.getInstance(BaseParser.TXT_TYPE);
				parser.insertOrUpdate(conn, curFile);
			} else if (BaseParser.XML_TYPE.equals(curFileType)) {

				logger.info("文件<" + curFile.getName() + ">导入中...");
				parser = BaseParser.getInstance(BaseParser.XML_TYPE);
				parser.insertOrUpdate(conn, curFile);
			}

			if (gui != null) {
				gui.setWatchState("正在进行结束处理 ...");
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			// 导入结束处理
			if (parser.getChangeCount() > 0) {
				doLastWork(batchDate // 批量交换开始时间
						, BaseParser.getTableName(new File(curFile.getName())) // 数据库表名
						, curFile.getName() // 导入文件名
						, parser); // 解析器
			}

			// 导入成功
			if (parser.getFailureCount() == 0) {
				logger.info("文件<" + curFile.getName() + ">导入成功。");
				if (fileOperator.removeFileToOutfolder(curFile)) {
					logger.info("文件<" + curFile.getAbsolutePath() + ">移动到了<"
							+ fileOperator.getOutfolder().getAbsolutePath() + ">。");
				} else {
					logger.info("文件<" + curFile.getAbsolutePath() + ">移动失败！");
				}

				// 导入失败
			} else {
				logger.info("文件<" + curFile.getName() + ">导入失败。");
				if (fileOperator.removeFileToErrfolder(curFile)) {
					logger.info("文件<" + curFile.getAbsolutePath() + ">移动到了<"
							+ fileOperator.getErrfolder().getAbsolutePath() + ">。");
				} else {
					logger.info("文件<" + curFile.getAbsolutePath() + ">移动失败！");
				}
			}

		} catch (Exception e) {
			// 导入失败
			ExceptionUtils.error(e);
			logger.info("文件<" + curFile.getName() + ">导入失败。");
			if (fileOperator.removeFileToErrfolder(curFile)) {
				logger.info("文件<" + curFile.getAbsolutePath() + ">移动到了<"
						+ fileOperator.getErrfolder().getAbsolutePath() + ">。");
			} else {
				logger.info("文件<" + curFile.getAbsolutePath() + ">移动失败！");
			}
		} finally {
			logger.info("插入记录条数：" + parser.getInsertCount() + "条, 更新记录条数："
					+ parser.getUpdateCount() + "条, 失败记录条数：" + parser.getFailureCount() + "条, 总共："
					+ parser.getTotalCount() + "条。");
			resultBuf
					.append("插入：" + parser.getInsertCount() + "条,更新：" + parser.getUpdateCount()
							+ "条,失败：" + parser.getFailureCount() + "条,总共：" + parser.getTotalCount()
							+ "条  ");
			if (gui != null) {
				gui.setWatchState("插入：" + parser.getInsertCount() + "条 更新："
						+ parser.getUpdateCount() + "条 失败：" + parser.getFailureCount() + "条 总共："
						+ parser.getTotalCount() + "条");
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			try {
				DBUtils.closeConnection(conn);
			} catch (SQLException e) {
				ExceptionUtils.error(e);
			}
		}
	}

	/**
	 * 结束处理。
	 * 
	 * @param jhrq 交换日期
	 * @param jhtable 交换表名
	 * @param fileName 导入文件名
	 * @param parser 解析器
	 */
	public void doLastWork(Date jhrq, String jhtable, String fileName, IParser parser) {}
}